﻿using System;
using System.Text.RegularExpressions;
using System.Xml.Serialization;
using System.IO;
using TI_EntityLib.TiEntityObjects;
using System.Collections.Generic;

namespace TI
{
    /// <summary>
    /// Настройки  MergeTI
    /// </summary>
    public class MergeTiConfig
    {   
        public class FtpItemFileInfo
        {
            public DateTime DtStart { get; set; }
            public DateTime DtFinish { get; set; }
            public TiContetFileType ContetnType { get; set; }
            public FtpTiTypeFiles IncAllType { get; set; }
            public string  FileName { get; set; }            
        }

        private static MergeTiConfig _config = null;

        public static MergeTiConfig ReadConfig()
        {
            
                if (_config == null)
                {
                    string filename = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\TI_DATA\" + "MergeTiConfig.xml";   
                        XmlSerializer serializer = new XmlSerializer(typeof(MergeTiConfig));
                        FileStream fs = new FileStream(filename, FileMode.Open);
                        _config = (MergeTiConfig)serializer.Deserialize(fs);
                        fs.Close();
                }
            return _config;

        }

        public void WriteConfig()
        {
            string filename = Environment.CurrentDirectory + @"\" + "MergeTiConfig.xml";
            XmlSerializer mySerializer = new
            XmlSerializer(typeof(MergeTiConfig));
            StreamWriter myWriter = new StreamWriter(filename);
            mySerializer.Serialize(myWriter, this);
            myWriter.Close();
        }

        public class LoginConfig {
            public string Login { get; set; }
            public string Password { get; set; }
        }
        
        public class ProxyServerConfig {
            public string IP { get; set; }
            public int Port { get; set; }
            public LoginConfig Login { get; set; }            
        }

        
        public class AttachConvertorConfig {
            /// <summary>
            /// Каталог прикрепленной документации в виде HTML
            /// </summary>
            public string AttachmentFileFolder { get; set; }

            public string AttachmentHtmlFolder { get; set; }
        }

        public static string DefaultFileName = "MergeTiConfig.xml";

        //список ключевых слов 
        public List<string>  KeyWords {get;set;}

        //список id ключевых MNN 
        public List<string> MnnKeys{ get; set; }

        //список id ключевых MNN 
        public List<long> MnnKeys11 { get; set; }



        public string ConnectionString = "";

        /// <summary>
        /// Локальная папка- хранилище скаченных архивов
        /// </summary>
        public string LocalDataUploadFolderZIP { get; set; }

        /// <summary>
        /// Локальная папка- хранилище Bulck файлов
        /// </summary>
        public string LocalDataUploadFolderBulck { get; set; }
        
        public string BulckFolderURL { get; set; }
        
        /// <summary>
        /// Корневой католог XML 
        /// </summary>
        public string LocalDataUploadFolderXML { get; set; }

        /// <summary>
        /// Пременная папка
        /// </summary>
        public string TempFolder { get; set; }


        public AttachConvertorConfig AttchConvertorConfig {get;set;}
       
        /// <summary>
        /// Адрес FTP источника файлов 
        /// </summary>
        public string FtpDataSourceIP { get; set; }

        public LoginConfig Login { get; set; }
        
        public ProxyServerConfig ProxyConfig { get; set; }  

        
        /// <summary>
        /// Вернуть путь соответсвующий дню 
        /// </summary>
        /// <param name="day"></param>
        /// <returns></returns>
        public string GetCatalogXML(DateTime day)
        {
            Helper.FileTools.СeckAndCreateFolder(LocalDataUploadFolderXML);
            Helper.FileTools.СeckAndCreateFolder(LocalDataUploadFolderXML + day.Date.ToShortDateString() + @"\");
            return LocalDataUploadFolderXML + day.Date.ToShortDateString() + @"\"; ;            
        }

        public string GetAttachmentFilesFolder()
        {
            Helper.FileTools.СeckAndCreateFolder(this.AttchConvertorConfig.AttachmentFileFolder);
            return this.AttchConvertorConfig.AttachmentFileFolder;
        }

        public string GetCatalogBulkTXT(DateTime day)
        {        
            return BulckFolderURL + day.Date.ToShortDateString() + @"\";
        }

        /// <summary>
        /// Вернуть путь соответсвующий дню 
        /// </summary>
        /// <param name="day"></param>
        /// <returns></returns>
        public string GetCatalogZIP(DateTime day)
        {
            Helper.FileTools.СeckAndCreateFolder(LocalDataUploadFolderZIP);
            Helper.FileTools.СeckAndCreateFolder(LocalDataUploadFolderZIP + day.Date.ToShortDateString() + @"\");
            return LocalDataUploadFolderZIP + day.Date.ToShortDateString() + @"\" ;            
        }

        /// <summary>
        /// Вернуть путь соответсвующий дню 
        /// </summary>
        /// <param name="day"></param>
        /// <returns></returns>
        public string GetCatalogBulckTemp()
        {
            Helper.FileTools.СeckAndCreateFolder(LocalDataUploadFolderBulck + @"\BulckTemp\");
            return LocalDataUploadFolderBulck + @"\BulckTemp\";
        }

        /// <summary>
        /// Проанализировать название файла - все свалить в объект FtpItemFileInfo
        /// </summary>
        /// <param name="fileNаme"></param>
        /// <returns></returns>
        public static FtpItemFileInfo ParseFileInfo(string fileNаme)
        {
            string p_all = "_all_";            
            string p_contract = "contract_";
            string p_notifiaction = "notification_";
            string p_protokol = "protokol_";
            string p_date = "[0-9]{8}";
            FtpItemFileInfo result = new FtpItemFileInfo();

            try
            {
                //определяем тип файла 
                if (Regex.IsMatch(fileNаme, p_contract))
                    result.ContetnType = TiContetFileType.Contract;

                if (Regex.IsMatch(fileNаme, p_notifiaction))
                    result.ContetnType = TiContetFileType.Notification;

                if (Regex.IsMatch(fileNаme, p_protokol))
                    result.ContetnType = TiContetFileType.Protocol;

                //Тип файла неопределен 
                if (result.ContetnType == TiContetFileType.None)
                    return null;

                //Формируем даты файла 
                Regex r = new Regex(p_date, RegexOptions.IgnoreCase);

                MatchCollection s = r.Matches(fileNаme);
                result.DtStart = ParseFileNаmeDate(s[0].ToString());
                result.DtFinish = ParseFileNаmeDate(s[s.Count - 1].ToString());

                //Тип файла INC_ALL 
                if (Regex.IsMatch(fileNаme, p_all))
                    result.IncAllType = FtpTiTypeFiles.All;
                else
                    result.IncAllType = FtpTiTypeFiles.Inc;

                //имя файла
                if (fileNаme.IndexOf(p_contract) > -1)
                    result.FileName = fileNаme.Substring(fileNаme.IndexOf(p_contract));

                if (fileNаme.IndexOf(p_notifiaction) > -1)
                    result.FileName = fileNаme.Substring(fileNаme.IndexOf(p_notifiaction));

                if (fileNаme.IndexOf(p_protokol) > -1)
                    result.FileName = fileNаme.Substring(fileNаme.IndexOf(p_protokol));
            }
            catch
            { 
                return null;
            }

            return result  ;
        }

        private static DateTime ParseFileNаmeDate(string dateString)
        {
            DateTime r = DateTime.MinValue;
            try
            {
                dateString = dateString.Substring(0, 4) + "." + dateString.Substring(4);
                dateString = dateString.Substring(0, 7) + "." + dateString.Substring(7);
                r = Convert.ToDateTime(dateString);
                return r;
            }
            catch
            {
                return r;
            }
        }
    }
}
